import pymysql
import os
from dotenv import load_dotenv
# 从constant导入配置文件路径（用于加载.env）
from config.constant import ENV_FILE_PATH
# 导入日志工具（避免循环导入）
from utils.generate_logs_util import get_logger


class DBHelper:
    """数据库操作辅助类（仅从.env读取敏感配置，路径从constant导入）"""
    def __init__(self):
        # 加载.env文件（路径从constant获取）
        load_dotenv(ENV_FILE_PATH)
        # 从.env获取数据库敏感信息
        self.con = pymysql.connect(
            host=os.getenv("DB_HOST"),
            user=os.getenv("DB_USER"),
            password=os.getenv("DB_PASSWORD"),
            database=os.getenv("DB_NAME"),
            charset='utf8mb4'  # 解决中文乱码
        )
        self.cur = self.con.cursor()

    # 执行查询类SQL语句
    def select(self, sql):
        try:
            self.cur.execute(sql)
            return self.cur.fetchall()
        except Exception as e:
            logger = get_logger(__name__)
            logger.error(f"数据库查询失败！SQL: {sql}, 错误信息: {str(e)}", exc_info=True)
            raise  # 抛出异常，不掩盖错误

    # 执行写操作SQL语句（insert/update/delete）
    def execute(self, sql):
        try:
            self.cur.execute(sql)
            self.con.commit()
            return self.cur.fetchall()
        except Exception as e:
            self.con.rollback()  # 事务回滚
            logger = get_logger(__name__)
            logger.error(f"数据库执行失败！SQL: {sql}, 错误信息: {str(e)}", exc_info=True)
            raise
    
    # 关闭数据库连接资源
    def close(self):
        if self.cur:
            self.cur.close()
        if self.con:
            self.con.close()